#pragma once
#ifndef _SETTINGS_
#define _SETTINGS_

//================================================================================================================================
//================================================================================================================================
// Qt
#include <QtCore/QSettings>
#include <QtCore/QTextCodec>
#include <QtCore/QCoreApplication>
// Локальные
#include "service_global.h"
//================================================================================================================================
//================================================================================================================================
/// Класс, позволяющий создавать/читать файл с настройками программы.
class SERVICE_EXPORT Settings
{
public:
    /// Получение доступа к настройкам программы.
    static Settings* instance()
    {
        Q_ASSERT_X(m_Instance != NULL, "Settings::instance", "Settings object are not initialized");
        return m_Instance;
    }

    /// Задать значение указанной опции.
    void setSetting(const QString &key, const QVariant &val) {m_Settings->setValue(key, val);}

    /// Получить значение указанной опции.
    QVariant setting(const QString &key) const {return m_Settings->value(key);}

    /// Проверить существование настройки.
    bool exist(const QString &key) const {return m_Settings->contains(key);}

    /// Синхронизация с файлом настроек.
    void sync() {m_Settings->sync();}

    /// Подсоединение к файлу с настройками.
    static void init()
    {
        deinit();
        m_Instance = new Settings();
        m_Instance->m_Settings = new QSettings(qApp->applicationDirPath() + "/bridgman.ini", QSettings::IniFormat);
        m_Instance->m_Settings->setIniCodec(QTextCodec::codecForName("UTF-8"));
    }

    /// Отсоединение от файла с настройками.
    static void deinit()
    {
        if(m_Instance != NULL)
        {
            delete m_Instance->m_Settings;
            delete m_Instance;
            m_Instance = NULL;
        }
    }

private:
    // Запрещаем явно создавать/удалять объекты класса.
    Settings(){}
    ~Settings(){}

    QSettings *m_Settings;          ///< Класс для доступа к настройкам.
    static Settings *m_Instance;    ///< Единственный доступный экземпляр класса.
};

#endif // _SETTINGS_
